òɾۿûѧϰʹá
ԭַhttps://www.joinquant.com/post/13107

ԭһ˵ʽ鵽ԭĺ߽ۡ


ԭĲԴ£

'''
˼·
ѡɣͳһҵָÿ¹̶ʱѡȡǷָ
ѡȡָɷֵֹͨ5ֻƱΪ
ʱÿµһսĬϿڹƱйƱѡĹƱ
λƽλ
'''
import pandas as pd
import numpy as np
from jqdata import jy
import jqdata

# ʼ趨׼ȵ
def initialize(context):
    # 趨300Ϊ׼
    set_benchmark('000300.XSHG')
    # ̬Ȩģʽ(ʵ۸)
    set_option('use_real_price', True)
    # ݵ־ log.info()
    log.info('ʼʼȫֻһ')
    # ˵orderϵAPIıerror͵log
    # log.set_level('order', 'error')
    #Բ
    #ҵͳ
    g.days = 10
    #
    g.trade_days = 0
    #ҵֲֹ
    g.max_hold_stocknum = 5
    #ĹƱб
    g.buy_list = []
    #Ƿ
    g.trade = False
    ### Ʊ趨 ###
    # ƱÿʽʱǣʱӶ֮ʱӶ֮ǧ֮һӡ˰, ÿʽӶͿ5Ǯ
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    
    # ÿµһսв
    # ǰ
    run_daily(before_market_open,time='before_open', reference_security='000300.XSHG') 
    # ʱ
    run_daily(market_open,time='open', reference_security='000300.XSHG')
    
## ǰк     
def before_market_open(context):
    if g.trade_days%g.days == 0:
        g.trade = True
        #ȡҵָָg.daysߵҵ
        date = context.previous_date
        s_date = ShiftTradingDay(date,-g.days)
        hy_df = get_hy_pct(s_date,date)
        #ȡҵָĳɷֹ
        temp_list = get_industry_stocks(hy_df.index[0],date=date)
        #޳ͣƹ
        all_data = get_current_data()
        temp_list = [stock for stock in temp_list if not all_data[stock].paused]
        #ֵ
        g.buy_list = get_check_stocks_sort(context,temp_list)
        
    g.trade_days += 1
        
## ʱк
def market_open(context):
    if g.trade:
        #беĹƱ
        sell(context,g.buy_list)
        #벻ڳֲеĹƱҪĹƱƽʽ
        buy(context,g.buy_list)
        g.trade = False
#׺ - 
def buy(context, buy_lists):
    # ȡյ buy_lists б
    Num = g.max_hold_stocknum - len(context.portfolio.positions.keys())
    buy_lists = buy_lists[:Num]
    # Ʊ
    if len(buy_lists)>0:
        # ʽ
        cash = context.portfolio.total_value/(g.max_hold_stocknum*1.0)
        # 
        for s in buy_lists:
            order_value(s,cash)
       
# ׺ - 
def sell(context, buy_lists):
    # ȡ sell_lists б
    hold_stock = context.portfolio.positions.keys()
    for s in hold_stock:
        #беĹƱ
        if s not in buy_lists:
            order_target_value(s,0)   

#ֵ    
def get_check_stocks_sort(context,check_out_lists):
    df = get_fundamentals(query(valuation.circulating_cap,valuation.code).filter(valuation.code.in_(check_out_lists)),date=context.previous_date)
    #ascֵΪ0ӴС
    df = df.sort('circulating_cap',ascending=0)
    out_lists = list(df['code'].values)[:g.max_hold_stocknum]
    return out_lists
    
#ͳƸָǵ
#
#df
def get_hy_pct(date_s,date):
    #ָǵͳ
    #
    sw_hy = jqdata.get_industries(name='sw_l1')
    sw_hy_dict  = {}
    for i in sw_hy.index:
        value = get_SW_index(i,start_date=date_s,end_date=date)
        sw_hy_dict[i] = value
    pl_hy = pd.Panel(sw_hy_dict)
    pl = pl_hy.transpose(2,1,0)
    pl = pl.loc[['PrevClosePrice','OpenPrice','HighPrice','LowPrice','ClosePrice','TurnoverVolume','TurnoverValue'],:,:]
    #ǵ
    pl_pct = (pl.iloc[:,-1,:]/pl.iloc[:,-2,:]-1)*100
    pl_pct_5 = (pl.iloc[:,-1,:]/pl.iloc[:,-1-g.days,:]-1)*100
    
    df_fin = pd.concat([pl_pct['ClosePrice'],pl_pct_5['ClosePrice']],axis=1)
    df_fin.columns = ['ǵ%','nǵ%']
    return df_fin.sort('nǵ%',ascending=0)

#ȡNǰĽ
def ShiftTradingDay(date,shift=5):
    # ȡеĽգһнյ list,ԪֵΪ datetime.date .
    tradingday = jqdata.get_all_trade_days()
    # õdate֮shiftһбеб һ
    shiftday_index = list(tradingday).index(date)+shift
    # кŷظ Ϊdatetime.date
    return tradingday[shiftday_index]  

#ҵǵ
#ֱҵָݽ˵
def get_SW_index(SW_index = 801010,start_date = '2017-01-31',end_date = '2018-01-31'):
    index_list = ['PrevClosePrice','OpenPrice','HighPrice','LowPrice','ClosePrice','TurnoverVolume','TurnoverValue','TurnoverDeals','ChangePCT','UpdateTime']
    jydf = jy.run_query(query(jy.SecuMain).filter(jy.SecuMain.SecuCode==str(SW_index)))
    link=jydf[jydf.SecuCode==str(SW_index)]
    rows=jydf[jydf.SecuCode==str(SW_index)].index.tolist()
    result=link['InnerCode'][rows]

    df = jy.run_query(query(jy.QT_SYWGIndexQuote).filter(jy.QT_SYWGIndexQuote.InnerCode==str(result[0]),\
                                                   jy.QT_SYWGIndexQuote.TradingDay>=start_date,\
                                                         jy.QT_SYWGIndexQuote.TradingDay<=end_date
                                                        ))
    df.index = df['TradingDay']
    df = df[index_list]
    return df
